FIT2-2025b 第05回 リスト
アナウンス
講義パートは今日を入れて残2回です
11/12から制作物に着手
「ミニプロテーマを事前検討する」という課題を出します
C-2-1 企画書 期日:11/09(日) 23:59
前回授業の振り返り
「ボールとパッドの接触判定」
最終的にはこんなコードになったはず
code:python
def update():
global ballx, bally, vx, vy, padx, speed, score
# 中略
if 195 <= bally <= 200 and padx - 20 <= ballx <= padx + 20:
# padとボールが接触したとみなす
score = score + 100 # スコアを増やす
bally = 0 # y座標を0 (上辺)に戻す
ballx = pyxel.rndi(0, 199) # x座標はランダムに再設定
speed = speed + 0.5 # ボールを少し早くする
座標の位置関係を図にすると分かりやすい
https://gyazo.com/c90a2092e8c9c7612e7e41871e25f9e6
bally >= 195 = ボールがpadと同じ高さ以下になった
padx - 20 <= ballx <= padx + 20 padの左右幅内にボールの中心座標がある
上記が両立していれば「接触」と判定
⇔ 外周が掠っただけでは接触としない
本日の講義
https://gyazo.com/66284aaff04edc63f132d983605aa7d8
リスト
ボールを複数同時に制御する方法を教えます
リストを使ってボールを増やす際のコードの捉え方
for文で0, 1, 2と数字が取り出されるため、各リストのindexを使い X番目のボール を表現している
ballx[0], bally[0], vx[0], vy[0] … 1個目のボール
ballx[1], bally[1], vx[1], vy[1] … 2個目のボール
ballx[2], bally[2], vx[2], vy[2] … 3個目のボール
https://gyazo.com/1f6158ef976ee924992a4a1e14def2c5
B-10-3までは必修課題
B-10-4は任意課題とします
wasdでダンジョン内を移動するゲーム
code:python
import pyxel
# 10x10のマップを二重配列で定義
map = [9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 0, 9, 0, 0, 0, 0, 0, 0, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 0, 9, 0, 0, 0, 0, 0, 0, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 0, 0, 0, 0, 0, 0, 0, 0, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
# mapの各数字が何に該当するかを定義
field = 0
block = 9
character = 1
# キャラクターのx,y座標
char_x = 5
char_y = 5
# mapを10x10にしたので、1マスの縦横幅は20
cell_width = 20
def update():
global char_x, char_y
# WASDでキャラクター移動 and 移動先がblockだったら移動キャンセル
if pyxel.btnp(pyxel.KEY_A) and mapchar_x - 1char_y != block:
char_x -= 1
if pyxel.btnp(pyxel.KEY_S) and mapchar_xchar_y + 1 != block:
char_y += 1
if pyxel.btnp(pyxel.KEY_D) and mapchar_x + 1char_y != block:
char_x += 1
if pyxel.btnp(pyxel.KEY_W) and mapchar_xchar_y - 1 != block:
char_y -= 1
def draw():
pyxel.cls(7)
# マップを描画
for x, row in enumerate(map):
for y, cell in enumerate(row):
color = 7
if cell == block:
color = 0
pyxel.rect(x * cell_width, y * cell_width, cell_width, cell_width, color)
# キャラクターを描画
pyxel.rect(char_x * cell_width, char_y * cell_width, cell_width, cell_width, 5)
pyxel.init(200, 200)
pyxel.run(update, draw)
https://gyazo.com/744ac606303dd4fa18a40592e4a68773
改めて、ミニプロジェクトについて
C-1 ミニプロジェクトについて
ドキュメント類 16点
企画書4点
概要設計書 4点
詳細設計書 8点
中間発表 4点 => 12/24実施
コード本体 24点
プログラム ... 16点
改善案 ... 8点
https://gyazo.com/c4add33273cb9816f0834ac35199507b
→ 合計44点を40点上限で評価
1/14, 1/21 2日間をかけて講師に個別プレゼンしてもらいます
10分/人を想定
生徒によるゲームの概要説明、デモンストレーション実施 (~3分)
講師からの個別質疑を通じた実装内容の理解度確認 (7分)
全31名、310分かかるため2日かかる計算
厳正なる抽選の結果、発表日をrandomで振り分けました
都合がつかない方は個別調整後、教員に申し出を
https://gyazo.com/05e40b21edc583a7b2ee02d8a80e2cfa
まとめ
12/24および1/14 or 1/21のスケジュール確保を
プログラムは全16点、要件を満たせるゲームを考えることが重要
ドキュメント類の書き方は後段で別途解説します
小テスト が終わり次第今日は自由解散です
C-2-1 企画書 への着手を
#fit2-2025b